package org.ipower.platform.dao;

import java.io.Serializable;
import java.util.List;
import org.hibernate.SessionFactory;
import org.ipower.platform.domain.Pager;
import org.ipower.platform.domain.QueryCondition;
/**
 * 通用DAO接口。
 * @author  杨勇.
 * @param <T> 实体类。
 * */
public interface GenericDao<T extends Serializable> {
    /**
     * 设置Session工厂。
     * */
    public void setSessionFactory(SessionFactory sessionFactory);
    /**
     * 更新保存实体对象。
     * @param data 实体对象。
     * */
    public void update(final T data);
    /**
     * 更新保存实体对象集合。
     * @param list 实体对象集合。
     * */
    public void update(final List<T> list);
    /**
     *  新增保存实体对象。
     *  @param data 实体对象可变长数组。
     * */
    public void save(final T data);
    /**
     * 新增保存实体对象集合。
     * @param list 实体对象集合。
     * */
    public void save(final List<T> list);
    /**
     * 根据主键删除。
     * @param idValue 主键数据。
     * */
    public void delete(final Object idValue);
    /**
     * 删除实体对象。
     * @param data 实体对象可变长数组。
     * **/
    public void delete(final T data);
    /**
     * 删除实体对象集合。
     * @param list 实体对象集合。
     * */
    public void delete(final List<T> list);
    /**
     * 按条件删除实体对象。
     * @param fieldName 字段名称。
     * @param values 字段值可变长数组。
     * **/
    public void delete(final String fieldName, final String... values);
    /**
     * 获取实体对象。
     * @param idValue 主键值。
     * @return 实体对象。
     * **/
    public T load(final Object idValue);
    /**
     * 获取全部的实体对象集合。
     * @param entityClass 实体类型。
     * @return 实体对象集合。
     * */
    public List<T> loadAll();
    /**
     * 获取全部实体对象数据。
     * @param fieldName 字段名称。
     * @param values 字段值的可变长数组。
     * */
    public List<T> loadAll(final String fieldName, final String... values);
     /**
     * 获取全部数据。
     * @param entities 查询条件。
     * @return 数据集合。
     * */
    public List<T> loadAll(final List<QueryCondition> entities);
    /**
     * 名字查询执行存储过程。
     * @param queryName  名字查询名称。
     * @param paramNames 参数名数组。
     * @param values 参数值数组。
     * */
    public List<Object> namedQuery(final String queryName, final String[] paramNames, final Object[] values);
    /**
     * 获取分页排序数据。
     * @param ascProperty 排序字段。
     * @param isAsc 是否升序排列。
     * @param firstResult 
     * @param maxResult
     * @return 分页数据。
     * */
    public Pager<T> findAll(final String ascProperty, final boolean isAsc,  final int firstResult,  final int maxResult);
    /**
     * 获取分页排序数据。
     * @param ascProperty 排序字段。
     * @param isAsc 是否升序排列。
     * @param firstResult
     * @param maxResult 
     * @param entities 查询条件集合。
     * @return 分页数据。
     * */
    public Pager<T> findAll(final String ascProperty, final boolean isAsc, final int firstResult,  final int maxResult, final List<QueryCondition> entities);
}